package com.plpm.service;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.plpm.mapper.ImportTaskMapper;
import com.plpm.model.ImportTask;

import lombok.extern.slf4j.Slf4j;

/**
 * 导入任务服务类
 *
 * @author PLPM Team
 * @version 1.0
 */
@Slf4j
@Service
public class ImportTaskService {

    @Autowired
    private ImportTaskMapper importTaskMapper;

    /**
     * 根据ID查询导入任务
     */
    public ImportTask findById(Long id) {
        if (id == null) {
            log.warn("查询导入任务时ID不能为空");
            return null;
        }
        return importTaskMapper.findById(id);
    }

    /**
     * 根据文件名和import_status=1查询已经导入成功的任务
     */
    public ImportTask findSuccessImportByFileName(String fileName) {
        if (fileName == null || fileName.trim().isEmpty()) {
            log.warn("查询导入任务时文件名不能为空");
            return null;
        }
        return importTaskMapper.findSuccessImportByFileName(fileName);
    }

    /**
     * 根据文件名列表批量查询导入任务
     */
    public List<ImportTask> findByFileNames(List<String> fileNames) {
        if (fileNames == null || fileNames.isEmpty()) {
            log.warn("查询导入任务时文件名列表不能为空");
            return Collections.emptyList();
        }
        return importTaskMapper.findByFileNames(fileNames);
    }

    /**
     * 创建导入任务
     */
    @Transactional
    public boolean createImportTask(ImportTask importTask) {
        if (Objects.isNull(importTask)) {
            log.error("创建导入任务时任务对象不能为空");
            return false;
        }

        if (importTask.getFileName() == null || importTask.getFileName().trim().isEmpty()) {
            log.error("创建导入任务时文件名不能为空");
            return false;
        }

        // 检查同文件名并已导入成功的任务 是否已存在
        ImportTask existingTask = importTaskMapper.findSuccessImportByFileName(importTask.getFileName());
        if (existingTask != null) {
            log.warn("同文件名且已导入成功的任务已存在，文件名: {}", importTask.getFileName());
            return false;
        }

        // 设置默认值
        setDefaultValues(Collections.singletonList(importTask));

        try {
            int result = importTaskMapper.insert(importTask);
            if (result > 0) {
                log.info("成功创建导入任务，ID: {}, 文件名: {}", importTask.getId(), importTask.getFileName());
                return true;
            } else {
                log.error("创建导入任务失败，文件名: {}", importTask.getFileName());
                return false;
            }
        } catch (Exception e) {
            log.error("创建导入任务时发生异常，文件名: {}", importTask.getFileName(), e);
            return false;
        }
    }

    /**
     * 批量创建导入任务（返回插入数量）
     */
    @Transactional
    public int batchCreateImportTasks(List<ImportTask> importTasks) {
        return batchInsertInternal(importTasks);
    }

    /**
     * 批量插入导入任务的内部实现（消除重复代码）
     */
    private int batchInsertInternal(List<ImportTask> importTasks) {
        if (importTasks == null || importTasks.isEmpty()) {
            log.warn("批量插入导入任务时任务列表不能为空");
            return 0;
        }

        // 设置默认值
        setDefaultValues(importTasks);

        try {
            int result = importTaskMapper.batchInsert(importTasks);
            log.info("批量插入导入任务完成，成功插入 {} 条记录", result);
            return result;
        } catch (Exception e) {
            log.error("批量插入导入任务时发生异常", e);
            return 0;
        }
    }

    /**
     * 设置ImportTask的默认值
     */
    private void setDefaultValues(List<ImportTask> importTasks) {
        LocalDateTime now = LocalDateTime.now();
        for (ImportTask task : importTasks) {
            if (task.getCreateTime() == null) {
                task.setCreateTime(now);
            }
            if (task.getUpdateTime() == null) {
                task.setUpdateTime(now);
            }
            if (task.getRetryTime() == null) {
                task.setRetryTime(0);
            }
            if (task.getImportStatus() == null) {
                task.setImportStatus(0);
            }
            if (task.getSyncStatus() == null) {
                task.setSyncStatus(0);
            }
        }
    }
}